#ifndef MQCLIENTCONFIGDIALOG_H
#define MQCLIENTCONFIGDIALOG_H

#include <QDialog>
#include <QTimer>
#include <QPair>
#include "mqconfigmanager.h"  // 仍需要连接和业务配置结构体

QT_BEGIN_NAMESPACE
class QTabWidget;
class QLineEdit;
class QSpinBox;
class QCheckBox;
class QComboBox;
class QPushButton;
class QLabel;
QT_END_NAMESPACE

namespace Ui {
class MQClientConfigDialog;
}

/**
 * @brief MQ客户端配置对话框类
 * 
 * 提供图形界面用于配置MQ客户端的各项参数，包括：
 * - 连接配置（主机、端口、用户名、密码等）
 * - 业务配置（交换机、队列、绑定等）
 * 注：性能、可靠性、日志配置已硬编码到代码中
 */
class MQClientConfigDialog : public QDialog
{
    Q_OBJECT

public:
    /**
     * @brief 构造函数
     * @param parent 父窗口
     */
    explicit MQClientConfigDialog(QWidget *parent = nullptr);
    
    /**
     * @brief 析构函数
     */
    ~MQClientConfigDialog();

    /**
     * @brief 获取连接配置
     * @return 连接配置对象
     */
    MQConnectionConfig getConnectionConfig() const;
    
    /**
     * @brief 设置连接配置
     * @param config 连接配置对象
     */
    void setConnectionConfig(const MQConnectionConfig& config);
    
    /**
     * @brief 获取业务配置
     * @return 业务配置对象
     */
    MQBusinessConfig getBusinessConfig() const;
    
    /**
     * @brief 设置业务配置
     * @param config 业务配置对象
     */
    void setBusinessConfig(const MQBusinessConfig& config);

public slots:
    /**
     * @brief 测试连接
     */
    void testConnection();
    
    /**
     * @brief 加载默认配置
     */
    void loadDefaultConfig();
    
    /**
     * @brief 应用配置
     */
    void applyConfig();
    
    // 日志文件浏览功能已移除（日志配置已硬编码）
    
    /**
     * @brief 配置项改变时的处理
     */
    void onConfigChanged();

protected:
    /**
     * @brief 接受对话框时的处理
     */
    void accept() override;
    
    /**
     * @brief 拒绝对话框时的处理
     */
    void reject() override;

private slots:
    /**
     * @brief 测试连接超时处理
     */
    void onTestTimeout();

private:
    /**
     * @brief 初始化UI
     */
    void initializeUI();
    
    /**
     * @brief 连接信号和槽
     */
    void connectSignals();
    
    /**
     * @brief 从UI加载连接配置
     * @return 连接配置对象
     */
    MQConnectionConfig loadConnectionConfigFromUI() const;
    
    /**
     * @brief 从UI加载业务配置
     * @return 业务配置对象
     */
    MQBusinessConfig loadBusinessConfigFromUI() const;
    
    /**
     * @brief 将连接配置应用到UI
     * @param config 连接配置对象
     */
    void applyConnectionConfigToUI(const MQConnectionConfig& config);
    
    /**
     * @brief 将业务配置应用到UI
     * @param config 业务配置对象
     */
    void applyBusinessConfigToUI(const MQBusinessConfig& config);
    
    /**
     * @brief 验证连接配置
     * @param config 连接配置对象
     * @return 验证结果（是否有效，错误信息）
     */
    QPair<bool, QString> validateConnectionConfig(const MQConnectionConfig& config) const;
    
    /**
     * @brief 验证业务配置
     * @param config 业务配置对象
     * @return 验证结果（是否有效，错误信息）
     */
    QPair<bool, QString> validateBusinessConfig(const MQBusinessConfig& config) const;
    
    /**
     * @brief 更新状态标签
     * @param message 状态消息
     * @param isError 是否为错误状态
     */
    void updateStatus(const QString& message, bool isError = false);
    
    /**
     * @brief 设置UI启用状态
     * @param enabled 是否启用
     */
    void setUIEnabled(bool enabled);

private:
    Ui::MQClientConfigDialog *ui;           ///< UI对象
    QTimer* m_testTimer;                    ///< 测试连接超时定时器
    bool m_configChanged;                   ///< 配置是否已改变
    MQConnectionConfig m_originalConnectionConfig;  ///< 原始连接配置（用于取消时恢复）
    MQBusinessConfig m_originalBusinessConfig;      ///< 原始业务配置（用于取消时恢复）
};

#endif // MQCLIENTCONFIGDIALOG_H
